package encheres.presentation.ui;

import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.ParseException;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.border.EtchedBorder;
import javax.swing.text.MaskFormatter;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.WebServiceException;

import org.omg.CORBA.ORB;
import org.omg.CORBA.ORBPackage.InvalidName;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContext;
import org.omg.CosNaming.NamingContextHelper;
import org.omg.CosNaming.NamingContextPackage.CannotProceed;
import org.omg.CosNaming.NamingContextPackage.NotFound;

import encheres.manager.SessionManager;
import encheres.manager.corba.C_Categorie;
import encheres.manager.ws.IServiceEnchere;
import encheres.presentation.controleur.ProposerProduit;


public class JPanelProposerProduit extends JPanel {

	private JPanel jPanelDescriptionProduit = null;
	private JPanel jPanelEnchereProduit = null;
	private JLabel jLabelProposerProduit = null;
	private JLabel jLabelLibelleProduit = null;
	private JLabel jLabeldescriptifProduit = null;
	private JTextField jTextFieldLibelleProduit = null;
	private JTextArea jTextAreaDescriptifProduit = null;
	private JTree jTreeCategories = null;
	private JLabel jLabelCategories = null;
	private JButton jButtonEnregistrer = null;
	private JButton jButtonRAZ = null;
	private JLabel jLabelPrixDepart = null;
	private JLabel jLabelPrixAcceptation = null;
	private JLabel jLabelDateEcheance = null;
	private JTextField jTextFieldPrixDepart = null;
	private JFormattedTextField jTextFieldPrixAcceptation = null;
	private JFormattedTextField jTextFieldEcheance = null;
	private int idSession;
	private ProposerProduit controleurProduit = new ProposerProduit();
	
	/**
	 * This method initializes 
	 * 
	 */
	public JPanelProposerProduit(int idSession) {
		super();
		this.idSession = idSession;
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 */
	private void initialize() {
        jLabelProposerProduit = new JLabel();
        jLabelProposerProduit.setBounds(new Rectangle(14, 16, 353, 26));
        jLabelProposerProduit.setText("Création d'une enchère sur un produit");
        jLabelProposerProduit.setFont(new Font("Dialog", Font.BOLD, 18));
        this.setLayout(null);
        this.setSize(new Dimension(514, 649));
        this.add(getJPanelDescriptionProduit(), null);
        this.add(getJPanelEnchereProduit(), null);
        this.add(jLabelProposerProduit, null);
        this.add(getJButtonEnregistrer(), null);
        this.add(getJButtonRAZ(), null);
			
	}

	/**
	 * This method initializes jPanelDescriptionProduit	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanelDescriptionProduit() {
		if (jPanelDescriptionProduit == null) {
			jLabelCategories = new JLabel();
			jLabelCategories.setBounds(new Rectangle(22, 157, 76, 16));
			jLabelCategories.setText("Catégories :");
			jLabeldescriptifProduit = new JLabel();
			jLabeldescriptifProduit.setBounds(new Rectangle(22, 54, 67, 16));
			jLabeldescriptifProduit.setText("Descriptif :");
			jLabelLibelleProduit = new JLabel();
			jLabelLibelleProduit.setBounds(new Rectangle(22, 28, 50, 16));
			jLabelLibelleProduit.setText("Libellé : ");
			jPanelDescriptionProduit = new JPanel();
			jPanelDescriptionProduit.setLayout(null);
			jPanelDescriptionProduit.setBounds(new Rectangle(35, 57, 444, 401));
			jPanelDescriptionProduit.setBorder(BorderFactory.createTitledBorder("Description du produit"));
			jPanelDescriptionProduit.add(jLabelLibelleProduit, null);
			jPanelDescriptionProduit.add(jLabeldescriptifProduit, null);
			jPanelDescriptionProduit.add(getJTextFieldLibelleProduit(), null);
			jPanelDescriptionProduit.add(getJTextAreaDescriptifProduit(), null);
			jPanelDescriptionProduit.add(jLabelCategories, null);
			jPanelDescriptionProduit.add(getJTreeCategories(), null);
		}
		return jPanelDescriptionProduit;
	}

	/**
	 * This method initializes jPanelEnchereProduit	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanelEnchereProduit() {
		if (jPanelEnchereProduit == null) {
			jLabelDateEcheance = new JLabel();
			jLabelDateEcheance.setBounds(new Rectangle(22, 78, 68, 16));
			jLabelDateEcheance.setText("Echéance :");
			jLabelPrixAcceptation = new JLabel();
			jLabelPrixAcceptation.setBounds(new Rectangle(22, 53, 117, 16));
			jLabelPrixAcceptation.setText("Prix d'acceptation :");
			jLabelPrixDepart = new JLabel();
			jLabelPrixDepart.setBounds(new Rectangle(22, 28, 92, 16));
			jLabelPrixDepart.setText("Prix de départ :");
			jPanelEnchereProduit = new JPanel();
			jPanelEnchereProduit.setLayout(null);
			jPanelEnchereProduit.setBounds(new Rectangle(35, 471, 444, 110));
			jPanelEnchereProduit.setBorder(BorderFactory.createTitledBorder("Description de l'enchère"));
			jPanelEnchereProduit.add(jLabelPrixDepart, null);
			jPanelEnchereProduit.add(jLabelPrixAcceptation, null);
			jPanelEnchereProduit.add(jLabelDateEcheance, null);
			jPanelEnchereProduit.add(getJTextFieldPrixDepart(), null);
			jPanelEnchereProduit.add(getJTextFieldPrixAcceptation(), null);
			jPanelEnchereProduit.add(getJTextFieldEcheance(), null);
		}
		return jPanelEnchereProduit;
	}

	/**
	 * This method initializes jTextFieldLibelleProduit	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getJTextFieldLibelleProduit() {
		if (jTextFieldLibelleProduit == null) {
			jTextFieldLibelleProduit = new JTextField();
			jTextFieldLibelleProduit.setBounds(new Rectangle(97, 27, 330, 20));
		}
		return jTextFieldLibelleProduit;
	}

	/**
	 * This method initializes jTextAreaDescriptifProduit	
	 * 	
	 * @return javax.swing.JTextArea	
	 */
	private JTextArea getJTextAreaDescriptifProduit() {
		if (jTextAreaDescriptifProduit == null) {
			jTextAreaDescriptifProduit = new JTextArea();
			jTextAreaDescriptifProduit.setBounds(new Rectangle(97, 53, 330, 96));
			jTextAreaDescriptifProduit.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
		}
		return jTextAreaDescriptifProduit;
	}

	/**
	 * This method initializes jTreeCategories	
	 * 	
	 * @return javax.swing.JTree	
	 */
	private JTree getJTreeCategories() {
		if (jTreeCategories == null) {
			DefaultMutableTreeNode top = new DefaultMutableTreeNode("Toutes les catégories");
			controleurProduit.createNodes(top);
			jTreeCategories = new JTree(top);
			for(int i=0; i<jTreeCategories.getRowCount(); i++){
				jTreeCategories.expandRow(i);
			}
			jTreeCategories.setBounds(new Rectangle(97, 157, 330, 226));
			jTreeCategories.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
		}
		return jTreeCategories;
	}
	
	/**
	 * This method initializes jButtonEnregistrer	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButtonEnregistrer() {
		if (jButtonEnregistrer == null) {
			jButtonEnregistrer = new JButton();
			jButtonEnregistrer.setBounds(new Rectangle(370, 601, 109, 27));
			jButtonEnregistrer.setText("Enregistrer");
			jButtonEnregistrer.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					if(isFormulaireValide()){
						enregistrerProduit();
					} else {
						JOptionPane.showMessageDialog(jButtonEnregistrer.getRootPane(),
							    "Le formulaire de proposition d'un produit n'est pas correct !",
							    "Enchères - Attention !",
							    JOptionPane.WARNING_MESSAGE);
					}
				}
			});
		}
		return jButtonEnregistrer;
	}
	
	private void enregistrerProduit() {
		DefaultMutableTreeNode node = (DefaultMutableTreeNode)getJTreeCategories().getLastSelectedPathComponent();
		if(node != null){
			try {
				String libelleNode = (String)node.getUserObject();
				String[] tabLibelleNode = libelleNode.split("-");
				
				// données d'un produit
				int idCategorie = Integer.valueOf(tabLibelleNode[0]);
				String libelleProduit = getJTextFieldLibelleProduit().getText();
				String descriptifProduit = getJTextAreaDescriptifProduit().getText();
				String dateEcheance = getJTextFieldEcheance().getText();
				float prixDepart = Float.valueOf(getJTextFieldPrixDepart().getText());
				float prixAcceptation = Float.valueOf(getJTextFieldPrixAcceptation().getText());
				
				creerProduitAvecCorba(idCategorie, libelleProduit,
						descriptifProduit, dateEcheance, prixDepart,
						prixAcceptation);
				
//				creerProduitAvecWS(idCategorie, libelleProduit,
//						descriptifProduit, dateEcheance, prixDepart,
//						prixAcceptation);
				
			} catch (NumberFormatException nfe) {
				JOptionPane.showMessageDialog(jButtonEnregistrer.getRootPane(),
					    "Le formulaire de proposition d'un produit n'est pas correct !\n La catégorie ne possède pas d'identifiant correct ou un prix ne possède pas le bon format.",
					    "Enchères - Erreur !",
					    JOptionPane.ERROR_MESSAGE);
				System.err.println(nfe);
			} 
		}
	}

	/**
	 * This method initializes jButtonRAZ	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButtonRAZ() {
		if (jButtonRAZ == null) {
			jButtonRAZ = new JButton();
			jButtonRAZ.setBounds(new Rectangle(287, 601, 63, 27));
			jButtonRAZ.setText("RAZ");
			jButtonRAZ.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					getJTextFieldLibelleProduit().setText("");
					getJTextAreaDescriptifProduit().setText("");
					getJTreeCategories().getSelectionModel().clearSelection();
					getJTextFieldPrixDepart().setText("");
					getJTextFieldPrixAcceptation().setText("");
					getJTextFieldEcheance().setText("");
				}
			});
		}
		return jButtonRAZ;
	}

	/**
	 * This method initializes jTextFieldPrixDepart	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getJTextFieldPrixDepart() {
		if (jTextFieldPrixDepart == null) {
			jTextFieldPrixDepart = new JTextField();
			jTextFieldPrixDepart.setDocument(new JTextLimitedFloat(jTextFieldPrixDepart));
			jTextFieldPrixDepart.setBounds(new Rectangle(145, 27, 72, 20));
		}
		return jTextFieldPrixDepart;
	}

	/**
	 * This method initializes jTextFieldPrixAcceptation	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JFormattedTextField getJTextFieldPrixAcceptation() {
		if (jTextFieldPrixAcceptation == null) {
			jTextFieldPrixAcceptation = new JFormattedTextField();
			jTextFieldPrixAcceptation.setDocument(new JTextLimitedFloat(jTextFieldPrixAcceptation));
			jTextFieldPrixAcceptation.setBounds(new Rectangle(145, 52, 72, 20));
		}
		return jTextFieldPrixAcceptation;
	}

	/**
	 * This method initializes jTextFieldEcheance	
	 * 	
	 * @return javax.swing.JTextField	
	 * @throws ParseException 
	 */
	private JFormattedTextField getJTextFieldEcheance() {
		if (jTextFieldEcheance == null) {
			try {
				MaskFormatter echeanceFormatter = new MaskFormatter("##/##/####");
				echeanceFormatter.setPlaceholderCharacter('_');
				jTextFieldEcheance = new JFormattedTextField(echeanceFormatter);
			} catch (ParseException e) {
				e.printStackTrace();
			}
			jTextFieldEcheance.setBounds(new Rectangle(145, 77, 72, 20));
		}
		return jTextFieldEcheance;
	}

	public boolean isFormulaireValide() {
		return getJTextFieldLibelleProduit().getText() != null &&
				!getJTextFieldLibelleProduit().getText().equals("") &&
				getJTreeCategories().getSelectionCount() > 0 &&
				getJTreeCategories().getSelectionRows()[0] != 0 &&
				getJTextFieldPrixDepart().getText() != null &&
				!getJTextFieldPrixDepart().getText().equals("") &&
				Float.valueOf(getJTextFieldPrixDepart().getText()) > 0 &&
				getJTextFieldPrixAcceptation().getText() != null &&
				!getJTextFieldPrixAcceptation().getText().equals("") &&
				Float.valueOf(getJTextFieldPrixAcceptation().getText()) > 0 &&
				getJTextFieldEcheance().getText() != null &&
				!getJTextFieldEcheance().getText().equals("");
	}
	
	/**
	 * @param idCategorie
	 * @param libelleProduit
	 * @param descriptifProduit
	 * @param dateEcheance
	 * @param prixDepart
	 * @param prixAcceptation
	 * @throws FileNotFoundException
	 * @throws IOException
	 * @throws InvalidName
	 * @throws NotFound
	 * @throws CannotProceed
	 * @throws InvalidName
	 */
	private void creerProduitAvecCorba(int idCategorie, String libelleProduit,
			String descriptifProduit, String dateEcheance, float prixDepart,
			float prixAcceptation) {
		int resultat = CorbaManager.getManagerProduit().creerProduit(libelleProduit, idCategorie, descriptifProduit, dateEcheance, prixDepart, prixAcceptation, this.idSession);
		
		switch (resultat) {
		case 1:
			JOptionPane.showMessageDialog(jButtonEnregistrer.getRootPane(),
				    "Votre produit "+libelleProduit+" a été mis aux enchères.",
				    "Enchères",
				    JOptionPane.INFORMATION_MESSAGE);
			break;
		case 0:
			JOptionPane.showMessageDialog(jButtonEnregistrer.getRootPane(),
				    "Une erreur inconnue est survenue lors de l'ajout de votre produit. \nIl n'a pas été proposé.",
				    "Enchères - Erreur !",
				    JOptionPane.ERROR_MESSAGE);
			break;
		case -1:
			JOptionPane.showMessageDialog(jButtonEnregistrer.getRootPane(),
				    "Vous ête déconnecté ou vous ne vous êtes pas enregistré comme client. \nLe produit n'a pas été proposé aux enchères.",
				    "Enchères - Erreur !",
				    JOptionPane.ERROR_MESSAGE);
			break;
		default:
			break;
		}
	}
	
	private void creerProduitAvecWS(int idCategorie, String libelleProduit,
		String descriptifProduit, String dateEcheance, float prixDepart,
		float prixAcceptation) {
		
		try {
			int resultat = controleurProduit.creerNouveauProduit(idCategorie, libelleProduit,
					descriptifProduit, dateEcheance, prixDepart,
					prixAcceptation, this.idSession);
			switch (resultat) {
			case 1:
				JOptionPane.showMessageDialog(jButtonEnregistrer.getRootPane(),
					    "Votre produit "+libelleProduit+" a été mis aux enchères.",
					    "Enchères",
					    JOptionPane.INFORMATION_MESSAGE);
				break;
			case 0:
				JOptionPane.showMessageDialog(jButtonEnregistrer.getRootPane(),
					    "Une erreur inconnue est survenue lors de l'ajout de votre produit. \nIl n'a pas été proposé.",
					    "Enchères - Erreur !",
					    JOptionPane.ERROR_MESSAGE);
				break;
			case -1:
				JOptionPane.showMessageDialog(jButtonEnregistrer.getRootPane(),
					    "Vous ête déconnecté ou vous ne vous êtes pas enregistré comme client. \nLe produit n'a pas été proposé aux enchères.",
					    "Enchères - Erreur !",
					    JOptionPane.ERROR_MESSAGE);
				break;
			default:
				break;
			}
			
		} catch (MalformedURLException  e) {
			e.printStackTrace();
		} catch (IllegalArgumentException  e) {
			e.printStackTrace();
		} catch (WebServiceException  e) {
			e.printStackTrace();
		}
	}

}  
